home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1997 #3 / Amiga Plus CD - 1997 - No. 03.iso / pd / programmierung / alienbreed3d2_src / cheesesauce / fullscrnwall.s < prev    next >
Text File  |  1997-01-31  |  27KB  |  1,856 lines

  1. leftclip: dc.w 0
  2. rightclip: dc.w 0
  3. deftopclip: dc.w 0
  4. defbotclip: dc.w 0
  5. leftclipandlast: dc.w 0
  6.  
  7. SCALE MACRO
  8.  dc.w 64*0
  9.  dc.w 64*1
  10.  dc.w 64*1
  11.  dc.w 64*2
  12.  dc.w 64*2
  13.  dc.w 64*3
  14.  dc.w 64*3
  15.  dc.w 64*4
  16.  dc.w 64*4
  17.  dc.w 64*5
  18.  dc.w 64*5
  19.  dc.w 64*6
  20.  dc.w 64*6
  21.  dc.w 64*7
  22.  dc.w 64*7
  23.  dc.w 64*8
  24.  dc.w 64*8
  25.  dc.w 64*9
  26.  dc.w 64*9
  27.  dc.w 64*10
  28.  dc.w 64*10
  29.  dc.w 64*11
  30.  dc.w 64*11
  31.  dc.w 64*12
  32.  dc.w 64*12
  33.  dc.w 64*13
  34.  dc.w 64*13
  35.  dc.w 64*14
  36.  dc.w 64*14
  37.  dc.w 64*15
  38.  dc.w 64*15
  39.  dc.w 64*16
  40.  dc.w 64*16
  41.  dc.w 64*17
  42.  dc.w 64*17
  43.  dc.w 64*18
  44.  dc.w 64*18
  45.  dc.w 64*19
  46.  dc.w 64*19
  47.  dc.w 64*20
  48.  dc.w 64*20
  49.  dc.w 64*21
  50.  dc.w 64*21
  51.  dc.w 64*22
  52.  dc.w 64*22
  53.  dc.w 64*23
  54.  dc.w 64*23
  55.  dc.w 64*24
  56.  dc.w 64*24
  57.  dc.w 64*25
  58.  dc.w 64*25
  59.  dc.w 64*26
  60.  dc.w 64*26
  61.  dc.w 64*27
  62.  dc.w 64*27
  63.  dc.w 64*28
  64.  dc.w 64*28
  65.  dc.w 64*29
  66.  dc.w 64*29
  67.  dc.w 64*30
  68.  dc.w 64*30
  69.  dc.w 64*31
  70.  dc.w 64*31
  71.  dc.w 64*31
  72.  dc.w 64*31
  73.  dc.w 64*31
  74.  dc.w 64*31
  75.  dc.w 64*31
  76.  dc.w 64*31
  77.  dc.w 64*31
  78.  dc.w 64*31
  79.  dc.w 64*31
  80.  dc.w 64*31
  81.  dc.w 64*31
  82.  dc.w 64*31
  83.  dc.w 64*31
  84.  dc.w 64*31
  85.  dc.w 64*31
  86.  dc.w 64*31
  87.  dc.w 64*31
  88.  dc.w 64*31
  89.  ENDM
  90.  
  91. *********************************** 
  92.  
  93. * The screendivide routine is simpler
  94. * using a0=left pixel
  95. * a2= right pixel
  96. * d0= left dist
  97. * d2= right dist
  98. * d4 = left strip
  99. * d5 = right strip
  100.  
  101. * (a0)=leftx
  102. * 2(a0)=rightx
  103.  
  104. * 4(a0)=leftbm
  105. * 6(a0)=rightbm
  106.  
  107. * 8(a0)=leftdist
  108. * 10(a0)=rightdist
  109.  
  110. * 12(a0)=lefttop
  111. * 14(a0)=righttop
  112.  
  113. * 16(a0)=leftbot
  114. * 18(a0)=rightbot
  115.  
  116.  
  117. Doleftend:
  118.  
  119.  move.w leftclip,d0
  120.  sub.w #1,d0
  121.  move.w d0,leftclipandlast
  122.  
  123.  
  124.  move.w (a0),d0
  125.  move.w 2(a0),d1
  126.  sub.w d0,d1
  127.  bge.s sometodraw
  128.  rts
  129. sometodraw:
  130.  move.w itertab(pc,d1.w*4),d7
  131.  swap d0
  132.  move.w itertab+2(pc,d1.w*4),d6
  133.  clr.w d0
  134.  swap d1
  135.  clr.w d1
  136.  asr.l d6,d1
  137.  move.l d1,(a0)
  138.  
  139.  bra pstit
  140.  
  141. itertab:
  142.  incbin "iterfile"
  143.  
  144. pstit:
  145.  
  146.  moveq #0,d1
  147.  move.w 4(a0),d1
  148.  moveq #0,d2
  149.  move.w 6(a0),d2
  150.  sub.w d1,d2
  151.  swap d1
  152.  swap d2
  153.  asr.l d6,d2
  154.  move.l d2,4(a0)
  155.  
  156.  moveq #0,d2
  157.  move.w 8(a0),d2
  158.  moveq #0,d3
  159.  move.w 10(a0),d3
  160.  sub.w d2,d3
  161.  swap d2
  162.  swap d3
  163.  asr.l d6,d3
  164.  move.l d3,8(a0)
  165.  
  166.  moveq #0,d3
  167.  move.w 12(a0),d3
  168.  moveq #0,d4
  169.  move.w 14(a0),d4
  170.  sub.w d3,d4
  171.  swap d3
  172.  swap d4
  173.  asr.l d6,d4
  174.  move.l d4,12(a0)
  175.  
  176.  moveq #0,d4
  177.  move.w 16(a0),d4
  178.  moveq #0,d5
  179.  move.w 18(a0),d5
  180.  sub.w d4,d5
  181.  swap d4
  182.  swap d5
  183.  asr.l d6,d5
  184.  move.l d5,16(a0)
  185.  
  186.  
  187. *** Gouraud shading ***
  188.  moveq #0,d5
  189.  move.w 26(a0),d5
  190.  sub.w 24(a0),d5
  191.  add.w d5,d5
  192.  swap d5
  193.  asr.l d6,d5
  194.  move.l d5,28(a0)
  195.  moveq #0,d5
  196.  move.w 24(a0),d5
  197.  add.w d5,d5
  198.  swap d5
  199.  
  200.  bra screendivide
  201.  
  202. itercount: dc.w 0
  203.  
  204. screendividethru:
  205.  
  206. .scrdrawlop:
  207.  
  208.  move.w (a0)+,d0
  209.  move.l FASTBUFFER,a3
  210.  move.l (a0)+,d1
  211.  
  212.  bra .pastscrinto
  213.  
  214. .scrintocop:
  215.  incbin "XTOCOPX"
  216.  
  217. .pastscrinto 
  218.  
  219.  swap d1
  220.  
  221.  move.w d1,d6
  222.  and.w HORAND,d6
  223.  move.l (a0)+,d2
  224.  swap d2
  225.  add.w fromtile(pc),d6
  226.  add.w d6,d6
  227.  move.w d6,a5
  228.  move.l (a0)+,d3
  229.  swap d3
  230.  add.l #divthreetab,a5
  231.  move.w (a5),StripData
  232.  
  233.  move.l ChunkAddr,a5
  234.  moveq #0,d6
  235.  move.b StripData,d6
  236.  add.w d6,d6
  237.  move.w VALSHIFT,d4
  238.  asl.w d4,d6
  239.  add.w d6,a5
  240.  move.l (a0)+,d4
  241.  swap d4
  242.  move.w d2,d6
  243. ***************************
  244. * old version
  245.  asr.w #7,d6
  246. ***************************
  247. ; asr.w #3,d6
  248. ; sub.w #4,d6
  249. ; cmp.w #6,d6
  250. ; blt.s tstbrbr
  251. ; move.w #6,d6
  252. ;tstbrbr:
  253. ***************************
  254.  add.w angbright(pc),d6
  255.  bge.s .brnotneg
  256.  moveq #0,d6
  257. .brnotneg
  258.  cmp.w #32,d6
  259.  blt.s .brnotpos
  260.  move.w #32,d6
  261. .brnotpos
  262.  move.l PaletteAddr,a2
  263.  move.l a2,a4
  264.  add.w .ffscrpickhowbright(pc,d6*2),a2
  265. ; and.b #$fe,d6
  266. ; add.w .ffscrpickhowbright(pc,d6*2),a4
  267.  
  268. ; btst #0,d0
  269. ; beq .nobrightswap
  270. ; exg a2,a4
  271. ;.nobrightswap:
  272.  
  273.  move.w d7,-(a7)
  274.  bsr ScreenWallstripdrawthru
  275.  move.w (a7)+,d7
  276.  
  277.  dbra d7,.scrdrawlop
  278.  rts
  279.  
  280. .ffscrpickhowbright:
  281.  SCALE
  282.  
  283.  
  284. ***************************
  285.  
  286. screendivide:
  287.  
  288.  or.l #$ffff0000,d7
  289.  move.w leftclipandlast(pc),d6
  290.  move.l #WorkSpace,a2
  291.  
  292.  move.l (a0),a3
  293.  move.l 4(a0),a4
  294.  move.l 8(a0),a5
  295.  move.l 12(a0),a6
  296.  move.l 16(a0),a1
  297.  move.l 28(a0),a0
  298.  
  299. scrdivlop:
  300.  
  301.  swap d0
  302.  cmp.w d6,d0
  303.  bgt scrnotoffleft
  304.  swap d0
  305.  add.l a4,d1
  306.  add.l a5,d2
  307.  add.l a6,d3
  308.  add.l a1,d4
  309.  add.l a3,d0
  310.  add.l a0,d5
  311.  dbra d7,scrdivlop
  312.  rts
  313.  
  314. scrnotoffleft:
  315.  
  316.  move.w d0,d6
  317.  
  318.  cmp.w rightclip(pc),d0
  319.  bge.s outofcalc
  320.  
  321. scrnotoffright:
  322.  
  323.  
  324.  move.w d0,(a2)+
  325.  move.l d1,(a2)+
  326.  move.l d2,(a2)+
  327.  move.l d3,(a2)+
  328.  move.l d4,(a2)+
  329.  move.l d5,(a2)+
  330.  swap d0
  331.  add.l a3,d0
  332.  add.l a4,d1
  333.  add.l a5,d2
  334.  add.l a6,d3
  335.  add.l a1,d4
  336.  add.l a0,d5
  337.  add.l #$10000,d7
  338.  dbra d7,scrdivlop
  339.  
  340. outofcalc:
  341.  swap d7
  342.  tst.w d7
  343.  bge.s .somethingtodraw
  344.  rts
  345. .somethingtodraw:
  346.  
  347.  move.l #consttab,a1
  348.  move.l #WorkSpace,a0
  349.  
  350. ; tst.b seethru
  351. ; bne screendividethru
  352.  
  353. scrdrawlop:
  354.  
  355.  move.w (a0)+,d0
  356.  move.l FASTBUFFER,a3
  357.  lea (a3,d0.w*2),a3
  358.  move.l (a0)+,d1
  359.  
  360. ; bra pastscrinto
  361. ;
  362. ;pastscrinto 
  363.  
  364.  swap d1
  365.  
  366.  move.w d1,d6
  367.  and.w HORAND,d6
  368.  move.l (a0)+,d2
  369.  swap d2
  370.  add.w fromtile(pc),d6
  371.  add.w d6,d6
  372.  move.w d6,a5
  373.  move.l (a0)+,d3
  374.  swap d3
  375.  add.l #divthreetab,a5
  376.  move.w (a5),StripData
  377.  
  378.  move.l ChunkAddr,a5
  379.  moveq #0,d6
  380.  move.b StripData,d6
  381.  add.w d6,d6
  382.  move.w VALSHIFT,d4
  383.  asl.w d4,d6
  384.  add.w d6,a5
  385.  move.l (a0)+,d4
  386.  swap d4
  387.  move.w d2,d6
  388. ***************************
  389. * old version
  390.  asr.w #7,d6
  391. ***************************
  392. ; asr.w #3,d6
  393. ; sub.w #4,d6
  394. ; cmp.w #6,d6
  395. ; blt.s tstbrbr
  396. ; move.w #6,d6
  397. ;tstbrbr:
  398. ***************************
  399.  move.l (a0)+,d5
  400.  swap d5
  401.  ext.w d5
  402.  add.w d5,d6
  403.  bge.s .brnotneg
  404.  moveq #0,d6
  405. .brnotneg
  406.  cmp.w #64,d6
  407.  blt.s .brnotpos
  408.  move.w #64,d6
  409. .brnotpos
  410.  move.l PaletteAddr,a2
  411.  move.l a2,a4
  412.  add.w ffscrpickhowbright(pc,d6*2),a2
  413.  and.b #$fe,d6
  414.  add.w ffscrpickhowbright(pc,d6*2),a4
  415.  
  416.  btst #0,d0
  417.  beq .nobrightswap
  418.  exg a2,a4
  419. .nobrightswap:
  420.  
  421.  move.w d7,-(a7)
  422.  bsr ScreenWallstripdraw
  423.  move.w (a7)+,d7
  424.  
  425. toosmall:
  426.  
  427.  dbra d7,scrdrawlop
  428.  
  429.  rts
  430.  
  431. middleline:
  432.  dc.w 0
  433.  
  434. ;scrintocop:
  435. ; incbin "XTOCOPX"
  436. prot4: dc.w 0
  437.  
  438. fromtile: dc.l 0
  439. fromquartertile: dc.l 0
  440. swapbrights: dc.w 0
  441. angbright: dc.w 0
  442.  
  443. leftside: dc.b 0
  444. rightside: dc.b 0
  445. firstleft: dc.w 0
  446.  
  447. ffscrpickhowbright:
  448.  SCALE
  449.  
  450. divthreetab:
  451. val SET 0
  452.  REPT 130
  453.  dc.b val,0
  454.  dc.b val,1
  455.  dc.b val,2
  456. val SET val+1
  457.  ENDR
  458.  
  459. StripData: dc.w 0
  460.  
  461. * using a0=left pixel
  462. * a2= right pixel
  463. * d0= left height
  464. * d2= right height
  465. * d4 = left strip
  466. * d5 = right strip
  467.  
  468.  
  469. * Routine to draw a wall;
  470. * pass it X and Z coords of the endpoints
  471. * and the start and end length, and a number
  472. * representing the number of the wall.
  473.  
  474. * a0=x1 d1=z1 a2=x2 d3=z2
  475. * d4=sl d5=el
  476. * a1 = strip buffer
  477.  
  478. store: ds.l 500
  479.  
  480. ******************************************************************
  481.  
  482. * Curve drawing routine. We have to know:
  483. * The top and bottom of the wall
  484. * The point defining the centre of the arc
  485. * the point defining the starting point of the arc
  486. * the start and end angles of the arc
  487. * The start and end positions along the bitmap of the arc
  488. * Which bitmap to use for the arc
  489.  
  490. xmiddle: dc.w 0
  491. zmiddle SET 2
  492.  dc.w 0
  493. xradius SET 4
  494.  dc.w 0
  495. zradius SET 6
  496.  dc.w 0
  497. startbitmap SET 8
  498.  dc.w 0
  499. bitmapcounter SET 10
  500.  dc.w 0
  501. brightmult SET 12
  502.  dc.w 0
  503. angadd SET 14
  504.  dc.l 0
  505. xmiddlebig SET 18
  506.  dc.l 0
  507. basebright SET 22
  508.  dc.w 0
  509. shift SET 24
  510.  dc.w 0
  511. count SET 26
  512.  dc.w 0
  513.  
  514. subdividevals:
  515.  dc.w 2,4
  516.  dc.w 3,8
  517.  dc.w 4,16
  518.  dc.w 5,32
  519.  dc.w 6,64
  520.  
  521. CurveDraw:
  522.  
  523.  move.w (a0)+,d0    ; centre of rotation
  524.  move.w (a0)+,d1    ; point on arc
  525.  move.l #Rotated,a1
  526.  move.l #xmiddle,a2
  527.  move.l (a1,d0.w*8),d2
  528.  move.l d2,18(a2)
  529.  asr.l #7,d2
  530.  move.l (a1,d1.w*8),d4
  531.  asr.l #7,d4
  532.  sub.w d2,d4
  533.  move.w d2,(a2)
  534.  move.w d4,4(a2)
  535.  move.w 6(a1,d0.w*8),d2
  536.  move.w 6(a1,d1.w*8),d4
  537.  sub.w d2,d4
  538.  move.w d2,2(a2)
  539.  asr.w #1,d4
  540.  move.w d4,6(a2)
  541.  move.w (a0)+,d4    ; start of bitmap
  542.  move.w (a0)+,d5    ; end of bitmap
  543.  move.w d4,8(a2)
  544.  sub.w d4,d5
  545.  move.w d5,10(a2)
  546.  move.w (a0)+,d4
  547.  ext.l d4
  548.  move.l d4,14(a2)
  549.  move.w (a0)+,d4
  550.  move.l #subdividevals,a3
  551.  move.l (a3,d4.w*4),shift(a2)
  552.  
  553.  move.l #walltiles,a3
  554.  add.l (a0)+,a3
  555.  adda.w wallyoff,a3
  556.  move.l a3,fromtile
  557.  move.w (a0)+,basebright(a2)
  558.  move.w (a0)+,brightmult(a2)
  559.  move.l (a0)+,topofwall
  560.  move.l (a0)+,botofwall
  561.  move.l yoff,d6
  562.  sub.l d6,topofwall
  563.  sub.l d6,botofwall
  564.  
  565.  move.l #databuffer,a1
  566.  move.l #SineTable,a3
  567.  lea 2048(a3),a4
  568.  moveq #0,d0
  569.  moveq #0,d1
  570.  move.w count(a2),d7
  571. DivideCurve
  572.  move.l d0,d2
  573.  move.w shift(a2),d4
  574.  asr.l d4,d2
  575.  move.w (a3,d2.w*2),d4
  576.  move.w d4,d5
  577.  move.w (a4,d2.w*2),d3
  578.  move.w d3,d6
  579.  muls.w 4(a2),d3
  580.  muls.w 6(a2),d4
  581.  muls.w 4(a2),d5
  582.  muls.w 6(a2),d6
  583.  sub.l d4,d3
  584.  add.l d6,d5
  585.  asl.l #2,d5
  586.  asr.l #8,d3
  587.  add.l 18(a2),d3
  588.  swap d5
  589.  move.w basebright(a2),d6
  590.  move.w brightmult(a2),d4
  591.  muls d5,d4
  592.  swap d4
  593.  add.w d4,d6
  594.  
  595.  add.w 2(a2),d5
  596.  move.l d3,(a1)+
  597.  move.w d5,(a1)+
  598.  move.w d1,d2
  599.  move.w shift(a2),d4
  600.  asr.w d4,d2
  601.  add.w 8(a2),d2
  602.  move.w d2,(a1)+
  603.  move.w d6,(a1)+
  604.  
  605.  add.l 14(a2),d0  
  606.  add.w 10(a2),d1
  607.  dbra d7,DivideCurve
  608.  
  609.  move.l a0,-(a7)
  610.  
  611. ; move.w #31,d6
  612. ; move.l #0,d3
  613. ; move.l #stripbuffer,a4
  614. ;.emptylop:
  615. ; move.l d3,(a4)+
  616. ; dbra d6,.emptylop
  617.  
  618.  bsr curvecalc
  619.  
  620.  move.l (a7)+,a0
  621.  
  622.  rts
  623.  
  624. prot3: dc.w 0
  625.  
  626. curvecalc:
  627.  move.l #databuffer,a1
  628.  move.w count(a2),d7
  629.  subq #1,d7
  630. .findfirstinfront:
  631.  move.l (a1)+,d1
  632.  move.w (a1)+,d0
  633.  bgt.s .foundinfront
  634.  move.w (a1)+,d4
  635.  move.w (a1)+,d6
  636.  dbra d7,.findfirstinfront
  637. ; CACHE_ON d2
  638.  rts    ; no two points were in front
  639.  
  640. .foundinfront:
  641.  move.w (a1)+,d4
  642.  move.w (a1)+,d6
  643.  ; d1=left x, d4=left end, d0=left dist
  644.  ; d6=left angbright 
  645.  
  646.  divs d0,d1
  647.  add.w #MIDDLEX,d1
  648.  
  649.  move.l topofwall(pc),d5
  650.  divs d0,d5
  651.  add.w MIDDLEY,d5
  652.  move.w d5,strtop
  653.  move.l botofwall(pc),d5
  654.  divs d0,d5
  655.  add.w MIDDLEY,d5
  656.  move.w d5,strbot
  657.  
  658. ; CACHE_OFF d2
  659.  
  660. .computeloop:
  661.  move.w 4(a1),d2
  662.  bgt.s .infront
  663.  
  664. ; addq #8,a1
  665. ; dbra d7,.findfirstinfront
  666.  
  667. ; CACHE_ON d2
  668.  rts
  669.  
  670. .infront:
  671.  move.l #store,a0
  672.  move.l (a1),d3
  673.  move.w 6(a1),d5
  674.  add.w 8(a1),d6
  675.  asr.w #1,d6
  676.  move.w d6,angbright
  677.  divs d2,d3
  678.  add.w #MIDDLEX,d3
  679.  move.w strtop(pc),12(a0)
  680.  move.w strbot(pc),16(a0)
  681.  move.l topofwall(pc),d6
  682.  divs d2,d6
  683.  add.w MIDDLEY,d6
  684.  move.w d6,strtop
  685.  move.w d6,14(a0)
  686.  move.l botofwall(pc),d6
  687.  divs d2,d6
  688.  add.w MIDDLEY,d6
  689.  move.w d6,strbot
  690.  move.w d6,18(a0)
  691.  move.w d3,2(a1)
  692.  blt.s .alloffleft
  693.  cmp.w #RIGHTX,d1
  694.  bgt.s .alloffleft
  695.  
  696.  cmp.w d1,d3
  697.  blt.s .alloffleft
  698.  
  699.  move.w d1,(a0)
  700.  move.w d3,2(a0)
  701.  move.w d4,4(a0)
  702.  move.w d5,6(a0)
  703.  move.w d0,8(a0)
  704.  move.w d2,10(a0)
  705.  move.w d7,-(a7)
  706.  move.w #maxscrdiv,d7
  707.  bsr Doleftend
  708.  move.w (a7)+,d7
  709.  
  710. .alloffleft:
  711.  
  712.  move.l (a1)+,d1
  713.  move.w (a1)+,d0
  714.  move.w (a1)+,d4
  715.  move.w (a1)+,d6
  716.  
  717.  dbra d7,.computeloop
  718.  
  719. .alloffright:
  720. ; CACHE_ON d2
  721.  rts
  722.  
  723. ;protcheck:
  724. ; sub.l #53624,a3
  725. ; add.l #2345215,a2
  726. ; lea passspace-$30000(pc),a1
  727. ; add.l #$30000,a1
  728. ; lea startpass(pc),a5
  729. ; move.w #endpass-startpass-1,d1
  730. ;copypass:
  731. ; move.b (a5)+,(a1)+
  732. ; dbra d1,copypass
  733. ; sub.l a5,a5
  734. ; lea passspace-$30000(pc),a1
  735. ; add.l #$30000,a1
  736. ; jsr (a1)
  737. ; lea passspace-$30000(pc),a1
  738. ; add.l #$30000,a1
  739. ; lea startpass(pc),a5
  740. ; move.w #(endpass-startpass)/2-1,d1
  741. ;erasepass:
  742. ; move.w -(a5),(a1)+
  743. ; dbra d1,erasepass
  744. ; sub.l a5,a5
  745. ; sub.l a1,a1
  746. ; eor.l #$af594c72,d0
  747. ; sub.l #123453986,a4
  748. ; move.l d0,(a4)
  749. ; add.l #123453986,a4
  750. ; move.l #0,d0
  751. ; sub.l #2345215,a2
  752. ; jsr (a2)
  753. ; sub.l a2,a2
  754. ; eor.l #$af594c72,d0
  755. ; sub.l #123453986,a4
  756. ; move.l (a4),d1
  757. ; add.l #123453986,a4
  758. ; cmp.l d1,d0
  759. ; bne.s notrightt
  760. ; add.l #53624,a3
  761. ; move.w #9,d7
  762. ;sayitsok:
  763. ; move.l (a3)+,a2
  764. ; add.l #78935450,a2
  765. ; st (a2)
  766. ; dbra d7,sayitsok
  767. ;notrightt:
  768. ; sub.l a3,a3
  769. ;nullit:
  770. ; rts
  771. ; incbin "ab3:includes/protroutencoded"
  772.  
  773. endprot:
  774.  
  775. ******************************************************************
  776.  
  777. iters: dc.w 0
  778. multcount: dc.w 0
  779.  
  780. walldraw:
  781.  
  782.  tst.w d1
  783.  bgt.s oneinfront1
  784.  tst.w d3
  785.  bgt.s oneinfront
  786.  rts
  787.  
  788. oneinfront1
  789.  tst.w d3
  790.  ble.s oneinfront
  791. ; Bothinfront!
  792.  
  793.  nop
  794.  
  795. oneinfront
  796.  
  797.  move.w #32,d7
  798.  move.w #3,d6
  799.  
  800.  move.w d3,d0
  801.  sub.w d1,d0
  802.  bge.s notnegzdiff
  803.  neg.w d0
  804. notnegzdiff
  805. ; cmp.w #1024,d0
  806. ; blt.s nd01
  807. ; add.w d7,d7
  808. ; add.w #1,d6
  809. ;nd01:
  810.  cmp.w #512,d0
  811.  blt.s nd0 
  812.  add.w d7,d7
  813.  add.w #1,d6
  814.  bra nha
  815. nd0:
  816.  
  817.  cmp.w #256,d0
  818.  bgt.s nh1
  819.  asr.w #1,d7
  820.  subq #1,d6
  821. nh1:
  822.  cmp.w #128,d0
  823.  bgt.s nh2
  824.  asr.w #1,d7
  825.  subq #1,d6
  826. nh2:
  827.  
  828. nha:
  829.  
  830.  move.w d3,d0
  831.  cmp.w d1,d3
  832.  blt.s rightnearest
  833.  move.w d1,d0
  834. rightnearest:
  835.  cmp.w #64,d0
  836.  bgt.s nd1
  837.  addq #1,d6
  838.  add.w d7,d7
  839. nd1:
  840.  
  841.  cmp.w #128,d0
  842.  blt.s nh3
  843.  asr.w #1,d7
  844.  subq #1,d6
  845.  blt.s nh3
  846.  cmp.w #256,d0
  847.  blt.s nh3
  848.  asr.w #1,d7
  849.  subq #1,d6
  850. nh3:
  851.  move.w d6,iters
  852.  subq #1,d7
  853.  move.w d7,multcount
  854.  
  855.  move.l #databuffer,a3
  856.  move.l a0,d0
  857.  move.l a2,d2
  858.  
  859.  move.l d0,(a3)+
  860.  add.l d2,d0
  861.  move.w d1,(a3)+
  862.  asr.l #1,d0
  863.  move.w d4,(a3)+
  864.  
  865.  move.w leftwallbright,d6
  866.  move.w d6,(a3)+
  867.  
  868.  add.w d5,d4
  869.  move.l d0,(a3)+
  870.  add.w d3,d1
  871.  asr.w #1,d1
  872.  move.w d1,(a3)+
  873.  asr.w #1,d4
  874.  move.w d4,(a3)+
  875.  
  876.  add.w rightwallbright,d6
  877.  asr.w #1,d6
  878.  move.w d6,(a3)+
  879.  
  880.  move.l d2,(a3)+
  881.  move.w d3,(a3)+
  882.  move.w d5,(a3)+
  883.  move.w rightwallbright,(a3)+
  884.  
  885.  ; We now have the two endpoints and the midpoint
  886.  ; so we need to perform 1 iteration of the inner
  887.  ; loop, the first time.
  888.  
  889. * Decide how often to subdivide by how far away the wall is, and
  890. * how perp. it is to the player.
  891.  
  892.  move.l #databuffer,a0
  893.  move.l #databuffer2,a1
  894.  
  895.  move.w iters,d6
  896.  blt noiters
  897.  move.l #1,a2
  898.  
  899. iterloop:
  900.  move.l a0,a3
  901.  move.l a1,a4
  902.  move.w a2,d7
  903.  exg a0,a1
  904.  
  905.  move.l (a3)+,d0
  906.  move.w (a3)+,d1
  907.  move.l (a3)+,d2
  908. middleloop:
  909.  move.l d0,(a4)+
  910.  move.l (a3)+,d3
  911.  add.l d3,d0
  912.  move.w d1,(a4)+
  913.  asr.l #1,d0
  914.  move.w (a3)+,d4
  915.  add.w d4,d1
  916.  move.l d2,(a4)+
  917.  asr.w #1,d1
  918.  move.l (a3)+,d5
  919.  add.l d5,d2
  920.  move.l d0,(a4)+
  921.  asr.l #1,d2
  922.  move.w d1,(a4)+
  923.  move.l d2,(a4)+
  924.  
  925.  move.l d3,(a4)+
  926.  move.l (a3)+,d0
  927.  add.l d0,d3
  928.  
  929.  move.w d4,(a4)+
  930.  asr.l #1,d3
  931.  move.w (a3)+,d1
  932.  add.w d1,d4
  933.  move.l d5,(a4)+
  934.  asr.w #1,d4
  935.  move.l (a3)+,d2
  936.  add.l d2,d5
  937.  move.l d3,(a4)+
  938.  asr.l #1,d5
  939.  move.w d4,(a4)+
  940.  move.l d5,(a4)+
  941.  
  942.  
  943.  subq #1,d7
  944.  bgt.s middleloop
  945.  move.l d0,(a4)+
  946.  move.w d1,(a4)+
  947.  move.l d2,(a4)+
  948.  
  949.  add.w a2,a2
  950.  
  951.  dbra d6,iterloop
  952.  
  953. noiters:
  954.  
  955. CalcAndDraw:
  956.  
  957. ; CACHE_ON d2
  958.  
  959.  move.l a0,a1
  960.  move.w multcount,d7
  961. .findfirstinfront:
  962.  move.l (a1)+,d1
  963.  move.w (a1)+,d0
  964.  bgt.s .foundinfront
  965.  move.l (a1)+,d4
  966.  dbra d7,.findfirstinfront
  967.  rts    ; no two points were in front
  968.  
  969. .foundinfront:
  970.  move.w (a1)+,d4
  971.  move.w (a1)+,lbr
  972.  ; d1=left x, d4=left end, d0=left dist 
  973.  
  974.  divs d0,d1
  975.  add.w #MIDDLEX,d1
  976.  
  977.  move.l topofwall(pc),d5
  978.  divs d0,d5
  979.  add.w MIDDLEY,d5
  980.  move.w d5,strtop
  981.  move.l botofwall(pc),d5
  982.  divs d0,d5
  983.  add.w MIDDLEY,d5
  984.  move.w d5,strbot
  985.  
  986. .computeloop:
  987.  move.w 4(a1),d2
  988.  bgt.s .infront
  989.  rts
  990.  
  991. .infront:
  992.  move.l #store,a0
  993.  move.l (a1),d3
  994.  divs d2,d3
  995.  move.w 6(a1),d5
  996.  add.w #MIDDLEX,d3
  997.  move.w strtop(pc),12(a0)
  998.  move.l topofwall(pc),d6
  999.  divs d2,d6
  1000.  move.w strbot(pc),16(a0)
  1001.  add.w MIDDLEY,d6
  1002.  move.w d6,strtop
  1003.  move.w d6,14(a0)
  1004.  move.l botofwall(pc),d6
  1005.  divs d2,d6
  1006.  add.w MIDDLEY,d6
  1007.  move.w d6,strbot
  1008.  move.w d6,18(a0)
  1009.  move.w d3,2(a1)
  1010.  cmp.w leftclip(pc),d3
  1011.  blt.s .alloffleft
  1012.  cmp.w rightclip(pc),d1
  1013. ; cmp.w #95,d1
  1014.  bge.s .alloffright
  1015.  
  1016.  move.w d1,(a0)
  1017.  move.w d3,2(a0)
  1018.  move.w d4,4(a0)
  1019.  move.w d5,6(a0)
  1020.  move.w d0,8(a0)
  1021.  move.w d2,10(a0)
  1022.  
  1023.  move.w lbr,d5
  1024.  sub.w #300,d5
  1025.  ext.w d5
  1026.  move.w d5,24(a0)
  1027.  move.w 8(a1),d5
  1028.  sub.w #300,d5
  1029.  ext.w d5
  1030.  move.w d5,26(a0)
  1031.  
  1032.  movem.l d7/a1,-(a7)
  1033.  move.w #maxscrdiv,d7
  1034.  bsr Doleftend
  1035.  movem.l (a7)+,d7/a1
  1036.  
  1037. .alloffleft:
  1038.  
  1039.  move.l (a1)+,d1
  1040.  move.w (a1)+,d0
  1041.  move.w (a1)+,d4
  1042.  move.w (a1)+,lbr
  1043.  
  1044.  dbra d7,.computeloop
  1045.  rts
  1046.  
  1047. .alloffright:
  1048.  rts
  1049.  
  1050. lbr: dc.w 0
  1051. leftwallbright: dc.w 0
  1052. rightwallbright: dc.w 0
  1053. strtop: dc.w 0
  1054. strbot: dc.w 0
  1055.  
  1056. databuffer:
  1057.  ds.l 1200
  1058. databuffer2:
  1059.  ds.l 1200
  1060.  
  1061. ***********************************
  1062.  
  1063. * Need a routine which takes...?
  1064. * Top Y (3d)
  1065. * Bottom Y (3d)
  1066. * distance
  1067. * height of each tile (number and routine addr)
  1068. * And produces the appropriate strip on the
  1069. * screen.
  1070.  
  1071. topofwall: dc.l 0
  1072. botofwall: dc.l 0
  1073.  
  1074. nostripq:
  1075.  rts
  1076.  
  1077. ScreenWallstripdraw:
  1078.  
  1079.  move.w d4,d6
  1080.  cmp.w topclip(pc),d6
  1081.  blt.s nostripq
  1082.  cmp.w botclip(pc),d3
  1083.  bgt.s nostripq
  1084.  
  1085.  cmp.w botclip(pc),d6
  1086.  ble.s noclipbot
  1087.  move.w botclip(pc),d6
  1088. noclipbot:
  1089.  
  1090.  move.w d3,d5
  1091.  cmp.w topclip(pc),d5
  1092.  bge.s nocliptop
  1093.  move.w topclip(pc),d5
  1094.  btst #0,d5
  1095.  beq.s .nsbd
  1096.  exg a2,a4
  1097. .nsbd:
  1098.  
  1099.  sub.w d5,d6    ; height to draw.
  1100.  ble.s nostripq
  1101.  
  1102.  bra gotoend
  1103.  
  1104. nocliptop:
  1105.  
  1106.  btst #0,d5
  1107.  beq.s .nsbd
  1108.  exg a2,a4
  1109. .nsbd:
  1110.  
  1111.  sub.w d5,d6    ; height to draw.
  1112.  ble.s nostripq
  1113.  
  1114.  bra gotoend
  1115.  
  1116. wlcnt: dc.w 0
  1117.  
  1118.  CNOP 0,4
  1119. drawwalldimPACK0:
  1120.  and.w d7,d4
  1121.  move.b 1(a5,d4.w*2),d1
  1122.  and.b #31,d1
  1123.  add.l d3,d4
  1124.  move.w (a4,d1.w*2),(a3)
  1125.  adda.w d0,a3
  1126.  addx.w d2,d4
  1127.  dbra d6,drawwallPACK0
  1128.  rts
  1129.  
  1130.  CNOP 0,128 
  1131. drawwallPACK0:
  1132.  and.w d7,d4
  1133.  move.b 1(a5,d4.w*2),d1
  1134.  and.b #31,d1
  1135.  add.l d3,d4
  1136.  move.w (a2,d1.w*2),(a3)
  1137.  adda.w d0,a3
  1138.  addx.w d2,d4
  1139.  dbra d6,drawwalldimPACK0
  1140.  
  1141. nostrip:
  1142.  rts
  1143.  
  1144.  CNOP 0,4
  1145. drawwalldimPACK1:
  1146.  and.w d7,d4
  1147.  move.w (a5,d4.w*2),d1
  1148.  lsr.w #5,d1
  1149.  and.w #31,d1
  1150.  add.l d3,d4
  1151.  move.w (a4,d1.w*2),(a3)
  1152.  adda.w d0,a3
  1153.  addx.w d2,d4
  1154.  dbra d6,drawwallPACK1
  1155.  rts
  1156.  
  1157.  CNOP 0,4 
  1158. drawwallPACK1:
  1159.  and.w d7,d4
  1160.  move.w (a5,d4.w*2),d1
  1161.  lsr.w #5,d1
  1162.  and.w #31,d1
  1163.  add.l d3,d4
  1164.  move.w (a2,d1.w*2),(a3)
  1165.  adda.w d0,a3
  1166.  addx.w d2,d4
  1167.  dbra d6,drawwalldimPACK1
  1168.  
  1169.  rts
  1170.  
  1171.  CNOP 0,4
  1172. drawwalldimPACK2:
  1173.  and.w d7,d4
  1174.  move.b (a5,d4.w*2),d1
  1175.  lsr.b #2,d1
  1176.  add.l d3,d4
  1177.  move.w (a4,d1.w*2),(a3)
  1178.  adda.w d0,a3
  1179.  addx.w d2,d4
  1180.  dbra d6,drawwallPACK2
  1181.  rts
  1182.  
  1183.  CNOP 0,4 
  1184. drawwallPACK2:
  1185.  and.w d7,d4
  1186.  move.b (a5,d4.w*2),d1
  1187.  lsr.b #2,d1
  1188.  add.l d3,d4
  1189.  move.w (a2,d1.w*2),(a3)
  1190.  adda.w d0,a3
  1191.  addx.w d2,d4
  1192.  dbra d6,drawwalldimPACK2
  1193.  rts
  1194.  
  1195.  
  1196. usesimple:
  1197.  mulu d3,d4
  1198.  
  1199.  add.l d0,d4
  1200.  swap d4
  1201.  add.w totalyoff(pc),d4
  1202.  
  1203. cliptopusesimple
  1204.  move.w VALAND,d7
  1205.  move.w #320*2,d0
  1206.  moveq #0,d1
  1207.  cmp.l a4,a2
  1208.  blt.s usea2
  1209.  move.l a4,a2
  1210. usea2:
  1211.  
  1212.  and.w d7,d4
  1213.  
  1214.  move.l d2,d5
  1215.  clr.w d5
  1216.  cmp.b #1,StripData+1
  1217.  dbge d6,simplewalliPACK0
  1218.  dbne d6,simplewalliPACK1
  1219.  dble d6,simplewalliPACK2
  1220.  rts
  1221.  
  1222.  CNOP 0,4
  1223. simplewalliPACK0:
  1224.  move.b 1(a5,d4.w*2),d1
  1225.  and.b #31,d1
  1226.  move.w (a2,d1.w*2),d3
  1227. simplewallPACK0:
  1228.  move.w d3,(a3)
  1229.  adda.w d0,a3
  1230.  add.l d2,d4
  1231.  bcc.s .noread
  1232.  addq #1,d4
  1233.  and.w d7,d4
  1234.  move.b 1(a5,d4.w*2),d1
  1235.  and.b #31,d1
  1236.  move.w (a2,d1.w*2),d3
  1237. .noread:
  1238.  dbra d6,simplewallPACK0
  1239.  rts
  1240.  
  1241.  CNOP 0,4
  1242. simplewalliPACK1:
  1243.  move.w (a5,d4.w*2),d1
  1244.  lsr.w #5,d1
  1245.  and.w #31,d1
  1246.  move.w (a2,d1.w*2),d3
  1247. simplewallPACK1:
  1248.  move.w d3,(a3)
  1249.  adda.w d0,a3
  1250.  add.l d5,d4
  1251.  bcc.s .noread
  1252.  addq #1,d4
  1253.  and.w d7,d4
  1254.  move.w (a5,d4.w*2),d1
  1255.  lsr.w #5,d1
  1256.  and.w #31,d1
  1257.  move.w (a2,d1.w*2),d3
  1258. .noread:
  1259.  dbra d6,simplewallPACK1
  1260.  rts
  1261.  
  1262.  CNOP 0,4
  1263. simplewalliPACK2:
  1264.  move.b (a5,d4.w*2),d1
  1265.  lsr.b #2,d1
  1266.  and.b #31,d1
  1267.  move.w (a2,d1.w*2),d3
  1268. simplewallPACK2:
  1269.  move.w d3,(a3)
  1270.  adda.w d0,a3
  1271.  add.l d5,d4
  1272.  bcc.s .noread
  1273.  addq #1,d4
  1274.  and.w d7,d4
  1275.  move.b (a5,d4.w*2),d1
  1276.  lsr.b #2,d1
  1277.  move.w (a2,d1.w*2),d3
  1278. .noread:
  1279.  dbra d6,simplewallPACK2
  1280.  rts
  1281.  
  1282. ;gotoendnomult:
  1283. ; movem.l d0/d1/d2/d3/d4/d7,-(a7)
  1284. ; add.l timeslarge(pc,d5.w*4),a3 
  1285. ; move.w d5,d4
  1286. ; move.l 4(a1,d2.w*8),d0
  1287. ; move.l (a1,d2.w*8),d2
  1288. ; moveq #0,d3
  1289. ; move.w d2,d3
  1290. ; swap d2
  1291. ; tst.w d2
  1292. ; move.w wallyoff(pc),d4
  1293. ; add.w #44,d4
  1294. ; bne.s .notsimple
  1295. ; cmp.l #$b000,d3
  1296. ; ble cliptopusesimple
  1297. ;.notsimple:
  1298. ; bra cliptop
  1299.  
  1300. MIDDLEY: dc.w 120
  1301. BIGMIDDLEY: dc.l 320*2*120
  1302. TOPOFFSET: dc.w 0
  1303. SMIDDLEY: dc.w 120
  1304. SBIGMIDDLEY: dc.l 320*2*120
  1305. STOPOFFSET: dc.w 0
  1306.  
  1307. gotoend:
  1308.  
  1309.  add.l timeslarge(pc,d5.w*4),a3 
  1310.  
  1311.  move.w d2,d4
  1312.  add.w d2,d2
  1313.  add.w d2,d4
  1314.  
  1315.  move.l 4(a1,d4.w*8),d0
  1316.  add.w TOPOFFSET(pc),d5
  1317.  move.w d5,d4
  1318.  
  1319.  move.l (a1,d2.w*4),d2
  1320.  moveq #0,d3
  1321.  move.w d2,d3
  1322.  swap d2
  1323.  tst.w d2
  1324.  bne.s .notsimple
  1325.  cmp.l #$b000,d3
  1326.  ble usesimple
  1327. .notsimple:
  1328.  
  1329.  mulu d3,d4
  1330.  muls d2,d5
  1331.  add.l d0,d4
  1332.  swap d4
  1333.  add.w d5,d4
  1334.  add.w totalyoff(pc),d4
  1335. cliptop
  1336.  move.w VALAND,d7
  1337.  and.w d7,d4
  1338.  move.w #320*2,d0
  1339.  moveq #0,d1
  1340.  
  1341.  move.l d2,d3
  1342.  clr.w d3
  1343.  
  1344.  cmp.b #1,StripData+1
  1345.  dbge d6,drawwallPACK0
  1346.  dbne d6,drawwallPACK1
  1347.  dble d6,drawwallPACK2
  1348.  rts
  1349.  
  1350. timeslarge:
  1351.  
  1352. val SET 0
  1353.  REPT 256
  1354.  dc.l val
  1355. val SET val+320*2
  1356.  ENDR
  1357.  
  1358.  ds.l 100
  1359.  
  1360. nostripqthru:
  1361.  rts
  1362.  
  1363. ScreenWallstripdrawthru:
  1364.  
  1365.  move.w d4,d6
  1366.  cmp.w topclip(pc),d6
  1367.  blt.s nostripqthru
  1368.  cmp.w botclip(pc),d3
  1369.  bgt.s nostripqthru
  1370.  
  1371.  cmp.w botclip(pc),d6
  1372.  ble.s .noclipbot
  1373.  move.w botclip(pc),d6
  1374. .noclipbot:
  1375.  
  1376.  move.w d3,d5
  1377.  cmp.w topclip(pc),d5
  1378.  bge.s .nocliptop
  1379.  move.w topclip(pc),d5
  1380.  btst #0,d5
  1381.  beq.s .nsbd
  1382.  exg a2,a4
  1383. .nsbd:
  1384.  
  1385.  sub.w d5,d6    ; height to draw.
  1386.  ble.s nostripqthru
  1387.  
  1388.  bra gotoendthru
  1389.  
  1390. .nocliptop:
  1391.  
  1392.  btst #0,d5
  1393.  beq.s .nsbdthru
  1394.  exg a2,a4
  1395. .nsbdthru:
  1396.  
  1397.  sub.w d5,d6    ; height to draw.
  1398.  ble.s nostripqthru
  1399.  
  1400.  bra gotoendthru
  1401.  
  1402.  CNOP 0,4
  1403. drawwalldimthruPACK0:
  1404.  and.w d7,d4
  1405.  move.b 1(a5,d4.w*2),d1
  1406.  and.b #31,d1
  1407.  beq.s .holey
  1408.  move.w (a4,d1.w*2),(a3)
  1409. .holey:
  1410.  adda.w d0,a3
  1411.  add.l d3,d4
  1412.  addx.w d2,d4
  1413.  dbra d6,drawwallthruPACK0
  1414.  rts
  1415.  CNOP 0,4
  1416. drawwallthruPACK0:
  1417.  and.w d7,d4
  1418.  move.b 1(a5,d4.w*2),d1
  1419.  and.b #31,d1
  1420.  beq.s .holey
  1421.  move.w (a2,d1.w*2),(a3)
  1422. .holey:
  1423.  adda.w d0,a3
  1424.  add.l d3,d4
  1425.  addx.w d2,d4
  1426.  dbra d6,drawwalldimthruPACK0
  1427. nostripthru:
  1428.  rts
  1429.  
  1430.  CNOP 0,4
  1431. drawwalldimthruPACK1:
  1432.  and.w d7,d4
  1433.  move.w (a5,d4.w*2),d1
  1434.  lsr.w #5,d1
  1435.  and.w #31,d1
  1436.  beq.s .holey
  1437.  move.w (a4,d1.w*2),(a3)
  1438. .holey:
  1439.  adda.w d0,a3
  1440.  add.l d3,d4
  1441.  addx.w d2,d4
  1442.  dbra d6,drawwallthruPACK1
  1443.  rts
  1444.  CNOP 0,4
  1445. drawwallthruPACK1:
  1446.  and.w d7,d4
  1447.  move.w (a5,d4.w*2),d1
  1448.  lsr.w #5,d1
  1449.  and.w #31,d1
  1450.  beq.s .holey
  1451.  move.w (a2,d1.w*2),(a3)
  1452. .holey:
  1453.  adda.w d0,a3
  1454.  add.l d3,d4
  1455.  addx.w d2,d4
  1456.  dbra d6,drawwalldimthruPACK1
  1457.  rts
  1458.  
  1459.  CNOP 0,4
  1460. drawwalldimthruPACK2:
  1461.  and.w d7,d4
  1462.  move.b (a5,d4.w*2),d1
  1463.  lsr.b #2,d1
  1464.  and.b #31,d1
  1465.  beq.s .holey
  1466.  move.w (a4,d1.w*2),(a3)
  1467. .holey:
  1468.  adda.w d0,a3
  1469.  add.l d3,d4
  1470.  addx.w d2,d4
  1471.  dbra d6,drawwallthruPACK2
  1472.  rts
  1473.  CNOP 0,4
  1474. drawwallthruPACK2:
  1475.  and.w d7,d4
  1476.  move.b (a5,d4.w*2),d1
  1477.  lsr.b #2,d1
  1478.  and.b #31,d1
  1479.  beq.s .holey
  1480.  move.w (a2,d1.w*2),(a3)
  1481. .holey:
  1482.  adda.w d0,a3
  1483.  add.l d3,d4
  1484.  addx.w d2,d4
  1485.  dbra d6,drawwalldimthruPACK2
  1486.  rts
  1487.  
  1488.  
  1489. usesimplethru:
  1490.  mulu d3,d4
  1491.  
  1492.  add.l d0,d4
  1493.  swap d4
  1494.  add.w totalyoff(pc),d4
  1495.  
  1496. cliptopusesimplethru
  1497.  moveq #63,d7
  1498.  move.w #104*4,d0
  1499.  moveq #0,d1
  1500.  cmp.l a4,a2
  1501.  blt.s usea2thru
  1502.  move.l a4,a2
  1503. usea2thru:
  1504.  and.w d7,d4
  1505.  
  1506.  move.l d2,d5
  1507.  clr.w d5
  1508.  
  1509.  cmp.b #1,StripData+1
  1510.  dbge d6,simplewallthruiPACK0
  1511.  dbne d6,simplewallthruiPACK1
  1512.  dble d6,simplewallthruiPACK2
  1513.  rts
  1514.  
  1515.  CNOP 0,4
  1516. simplewallthruiPACK0:
  1517.  move.b 1(a5,d4.w*2),d1
  1518.  and.b #31,d1
  1519.  move.w (a2,d1.w*2),d3
  1520. simplewallthruPACK0:
  1521.  move.w d3,(a3)
  1522.  adda.w d0,a3
  1523.  add.l d5,d4
  1524.  bcc.s noreadthruPACK0
  1525. maybeholePACK0
  1526.  addx.w d2,d4
  1527.  and.w d7,d4
  1528.  move.b 1(a5,d4.w*2),d1
  1529.  and.b #31,d1
  1530.  beq.s holeysimplePACK0
  1531.  move.w (a2,d1.w*2),d3
  1532.  dbra d6,simplewallthruPACK0
  1533.  rts
  1534. noreadthruPACK0:
  1535.  addx.w d2,d4
  1536.  dbra d6,simplewallthruPACK0
  1537.  rts
  1538.  
  1539.  CNOP 0,4
  1540. simplewallholePACK0:
  1541.  adda.w d0,a3
  1542.  add.l d5,d4
  1543.  bcs.s maybeholePACK0
  1544.  addx.w d2,d4
  1545. holeysimplePACK0
  1546.  and.w d7,d4
  1547.  dbra d6,simplewallholePACK0
  1548.  rts
  1549.  
  1550.  CNOP 0,4
  1551. simplewallthruiPACK1:
  1552.  move.w (a5,d4.w*2),d1
  1553.  lsr.w #5,d1
  1554.  and.w #31,d1
  1555.  move.w (a2,d1.w*2),d3
  1556.  simplewallthruPACK1:
  1557.  move.w d3,(a3)
  1558.  adda.w d0,a3
  1559.  add.l d5,d4
  1560.  bcc.s noreadthruPACK1
  1561. maybeholePACK1
  1562.  addx.w d2,d4
  1563.  and.w d7,d4
  1564.  move.w (a5,d4.w*2),d1
  1565.  lsr.w #5,d1
  1566.  and.w #31,d1
  1567.  beq.s holeysimplePACK1
  1568.  move.w (a2,d1.w*2),d3
  1569.  dbra d6,simplewallthruPACK1
  1570.  rts
  1571. noreadthruPACK1:
  1572.  addx.w d2,d4
  1573.  dbra d6,simplewallthruPACK1
  1574.  rts
  1575.  
  1576.  CNOP 0,4
  1577. simplewallholePACK1:
  1578.  adda.w d0,a3
  1579.  add.l d5,d4
  1580.  bcs.s maybeholePACK1
  1581.  addx.w d5,d4
  1582. holeysimplePACK1
  1583.  and.w d7,d4
  1584.  dbra d6,simplewallholePACK1
  1585.  rts
  1586.  
  1587.  
  1588.  CNOP 0,4
  1589. simplewallthruiPACK2:
  1590.  move.b (a5,d4.w*2),d1
  1591.  lsr.b #2,d1
  1592.  and.b #31,d1
  1593.  move.w (a2,d1.w*2),d3
  1594. simplewallthruPACK2:
  1595.  move.w d3,(a3)
  1596.  adda.w d0,a3
  1597.  add.l d5,d4
  1598.  bcc.s noreadthruPACK2
  1599. maybeholePACK2
  1600.  addx.w d2,d4
  1601.  and.w d7,d4
  1602.  move.b (a5,d4.w*2),d1
  1603.  lsr.b #2,d1
  1604.  and.b #31,d1
  1605.  beq.s holeysimplePACK2
  1606.  move.w (a2,d1.w*2),d3
  1607.  dbra d6,simplewallthruPACK2
  1608.  rts
  1609. noreadthruPACK2:
  1610.  addx.w d2,d4
  1611.  dbra d6,simplewallthruPACK2
  1612.  rts
  1613.  
  1614.  CNOP 0,4
  1615. simplewallholePACK2
  1616.  adda.w d0,a3
  1617.  add.l d5,d4
  1618.  bcs.s maybeholePACK2
  1619.  addx.w d2,d4
  1620. holeysimplePACK2
  1621.  and.w d7,d4
  1622.  dbra d6,simplewallholePACK2
  1623.  rts
  1624.  
  1625.  
  1626. gotoendthru:
  1627.  add.l timeslargethru(pc,d5.w*4),a3 
  1628.  move.w d5,d4
  1629.  move.l 4(a1,d2.w*8),d0
  1630.  move.l (a1,d2.w*8),d2
  1631.  moveq #0,d3
  1632.  move.w d2,d3
  1633.  swap d2
  1634.  tst.w d2
  1635.  bne.s .notsimple
  1636.  cmp.l #$b000,d3
  1637.  ble usesimplethru
  1638. .notsimple:
  1639.  
  1640.  mulu d3,d4
  1641.  muls d2,d5
  1642.  add.l d0,d4
  1643.  swap d4
  1644.  add.w d5,d4
  1645.  add.w wallyoff(pc),d4
  1646. cliptopthru
  1647.  moveq #63,d7
  1648.  move.w #104*4,d0
  1649.  moveq #0,d1
  1650.  
  1651.  move.l d2,d3
  1652.  clr.w d3
  1653.  
  1654.  cmp.b #1,StripData+1
  1655.  dbge d6,drawwallthruPACK0
  1656.  dbne d6,drawwallthruPACK1
  1657.  dble d6,drawwallthruPACK2
  1658.  
  1659.  rts
  1660.  
  1661. timeslargethru:
  1662.  
  1663. val SET 104*4
  1664.  REPT 80
  1665.  dc.l val
  1666. val SET val+104*4
  1667.  ENDR
  1668.  
  1669. totalyoff: dc.w 0
  1670. wallyoff: dc.w 0
  1671.  
  1672. ******************************************
  1673. * Wall polygon
  1674. leftend: dc.w 0
  1675. wallbrightoff: dc.w 0
  1676.  
  1677. itsawalldraw:
  1678.  
  1679.  move.l #Rotated,a5
  1680.  move.l #OnScreen,a6
  1681.  
  1682.  move.w (a0)+,d0
  1683.  move.w (a0)+,d2
  1684.  move.w (a0)+,leftend
  1685.  move.w (a0)+,d5
  1686.  move.w (a0)+,d1
  1687.  asl.w #4,d1
  1688.  move.w d1,fromtile
  1689.  
  1690.  move.w (a0)+,d1
  1691.  move.w d1,totalyoff
  1692.  
  1693.  move.w (a0)+,d1
  1694.  move.l #walltiles,a3
  1695.  move.l (a3,d1.w*4),a3
  1696.  move.l a3,PaletteAddr
  1697.  add.l #64*32,a3
  1698.  move.l a3,ChunkAddr
  1699.  
  1700.  ;move.w (a0)+,d1
  1701.  ;add.w ZoneBright,d1
  1702.  move.w ZoneBright,angbright
  1703.  ;move.w (a0)+,d1
  1704.  ;move.w (a0)+,d4
  1705.  move.l yoff,d6
  1706.  
  1707.  move.b (a0)+,VALAND+1
  1708.  move.b (a0)+,VALSHIFT+1
  1709.  move.w (a0)+,HORAND
  1710.  
  1711.  move.w totalyoff,d1
  1712.  add.w wallyoff,d1
  1713.  and.w VALAND,d1
  1714.  move.w d1,totalyoff
  1715.  
  1716.  move.l (a0)+,topofwall
  1717.  sub.l d6,topofwall
  1718.  move.l (a0)+,botofwall
  1719.  sub.l d6,botofwall
  1720.  
  1721.  
  1722.  move.w (a0)+,wallbrightoff
  1723.  
  1724.  move.l topofwall,d3
  1725.  cmp.l botofwall,d3
  1726.  bge wallfacingaway
  1727.  
  1728.  
  1729.  tst.w 6(a5,d0*8)
  1730.  bgt.s cantell
  1731.  tst.w 6(a5,d2*8)
  1732.  ble wallfacingaway
  1733.  bra cliptotestfirstbehind
  1734. cantell:
  1735.  tst.w 6(a5,d2*8)
  1736.  ble.s cliptotestsecbehind
  1737.  bra pastclip
  1738. cliptotestfirstbehind:
  1739.  
  1740.  move.l (a5,d0*8),d3
  1741.  sub.l (a5,d2*8),d3
  1742.  move.w 6(a5,d0*8),d6
  1743.  sub.w 6(a5,d2*8),d6
  1744.  divs d6,d3
  1745.  muls 6(a5,d2*8),d3
  1746.  neg.l d3
  1747.  add.l (a5,d2*8),d3
  1748.  move.w (a6,d2*2),d6
  1749.  sub.w #MIDDLEX,d6
  1750.  ext.l d6
  1751.  cmp.l d6,d3
  1752.  bge wallfacingaway
  1753.  bra cant_tell
  1754.  bra pastclip
  1755.  
  1756. cliptotestsecbehind:
  1757.  
  1758.  move.l (a5,d2*8),d3
  1759.  sub.l (a5,d0*8),d3
  1760.  move.w 6(a5,d2*8),d6
  1761.  sub.w 6(a5,d0*8),d6
  1762.  divs d6,d3
  1763.  muls 6(a5,d0*8),d3
  1764.  neg.l d3
  1765.  add.l (a5,d0*8),d3
  1766.  move.w (a6,d0*2),d6
  1767.  sub.w #MIDDLEX,d6
  1768.  ext.l d6
  1769.  cmp.l d6,d3
  1770.  ble wallfacingaway
  1771.  bra cant_tell
  1772.  
  1773. pastclip:
  1774.  
  1775.  move.w (a6,d0*2),d3
  1776.  cmp.w #RIGHTX,d3
  1777.  bgt wallfacingaway
  1778.  cmp.w (a6,d2*2),d3
  1779.  bge wallfacingaway
  1780.  tst.w (a6,d2*2)
  1781.  blt.s wallfacingaway
  1782.  
  1783. cant_tell:
  1784.  
  1785. ; move.l a1,a4
  1786. ; move.w #31,d6
  1787. ; move.l #0,d3
  1788. ;.emptylop:
  1789. ; move.l d3,(a4)+
  1790. ; dbra d6,.emptylop
  1791.  
  1792. ; move.w rightclip(pc),d6
  1793. ; st (a1,d6)
  1794. ; move.w leftclip(pc),d6
  1795. ; st -1(a1,d6)
  1796.  
  1797. ; muls sinval(pc),d1
  1798. ; muls cosval(pc),d4
  1799. ; add.l d1,d4
  1800. ; add.l d4,d4
  1801. ; swap d4
  1802. ; neg.w d4
  1803. ; move.w d4,d6
  1804. ; asr.w #1,d4
  1805. ; sub.w d4,angbright
  1806. ; and.b #$fe,d4
  1807. ; asl.w #2,d4
  1808. ; asl.w #2,d6
  1809.  
  1810.  movem.l d7/a0/a5/a6,-(a7)
  1811.  move.l (a5,d0*8),a0
  1812. ; add.l a0,a0
  1813.  move.w 6(a5,d0*8),d1
  1814.  move.l (a5,d2*8),a2
  1815. ; add.l a2,a2
  1816.  move.w 6(a5,d2*8),d3
  1817.  
  1818.  move.l PointBrightsPtr,a5
  1819.  move.w (a5,d0.w*4),d0
  1820.  add.w #300,d0
  1821.  add.w wallbrightoff,d0
  1822.  move.w d0,leftwallbright
  1823.  move.w (a5,d2.w*4),d0
  1824.  add.w #300,d0
  1825.  add.w wallbrightoff,d0
  1826.  move.w d0,rightwallbright
  1827.  
  1828.  move.w leftend(pc),d4
  1829.  move.l #max3ddiv,d7
  1830.  bsr walldraw
  1831.  movem.l (a7)+,d7/a0/a5/a6
  1832.  
  1833. wallfacingaway:
  1834.  
  1835.  rts
  1836.  
  1837. PointBrightsPtr: dc.l 0
  1838. midpt: dc.l 0
  1839. dist1: dc.l 0
  1840. dist2: dc.l 0
  1841. VALAND: dc.w 0
  1842. VALSHIFT: dc.w 0
  1843. HORAND: dc.w 0
  1844.  
  1845. sinval: dc.w 0
  1846. cosval: dc.w 0
  1847.  
  1848. oldxoff: dc.w 0
  1849. oldzoff: dc.w 0
  1850.  
  1851. topclip: dc.w 0
  1852. botclip: dc.w 0
  1853. seethru: dc.w 0
  1854.